import json
import re

from loguru import logger

from tools.handle_data import Data
from tools.handle_faker import HandleFaker


class HandleReplace:

    # 当增加新的标记符 #xxx# 时，添加 新的elif 判断，并替换。
    def replace_one_row_single_case_data(self, case_dict):
        """
        请求前，把一条测试用例中带 #xxx# 标记的字符串，一次性全部替换。
        :param case_dict: 字典类型。在本框架当中是指从excel当中读取出来的一行用例数据。
        :return: 替换完成之后的字符串,并转换成字典返回。
        """
        # 把case_dict转成字符串。
        case_str = json.dumps(case_dict, ensure_ascii=False)

        # 根据正则表达式"#(\w.+?)#"，从case_str当中提取要替换的变量名，返回一个列表。
        to_be_replaced_variable_list = re.findall("#(\w.+?)#", case_str)

        # 如果提取得到的列表不为空，表示有要替换的变量。
        if to_be_replaced_variable_list:
            logger.info("========= 开始替换 #xxx# 标示符 =========")
            logger.debug("要替换的 #xxx# 标示符有:{}".format(to_be_replaced_variable_list))

            # 初始化一个HandleFaker类对象，用作后面的随机生成。
            handle_faker = HandleFaker()
            # 生成一个营业执照日期，元组数据类型，下表[0]表示过去的成立日期，下表[1]表示将来的有效日期。
            license_establish_validity_date = handle_faker.get_license_establish_validity_date()

            # 遍历要替换的变量
            for marked_variable in to_be_replaced_variable_list:
                # 先从Data全局变量类当中获取数据，如果没有从python脚本生成数据来替换。

                if hasattr(Data, marked_variable):
                    # 如果Data类中有variable属性，用variable属性值来替换。
                    value_from_data = getattr(Data, marked_variable)
                    if isinstance(value_from_data, str):
                        case_str = case_str.replace(f"#{marked_variable}#", value_from_data)
                        logger.debug("已从Data类中获取到字符串数据{}，并将标识符{}替换。".format(value_from_data, marked_variable))
                    else:
                        case_str = case_str.replace(f"#{marked_variable}#", str(value_from_data))
                        logger.debug("Data类中获取到数据不是字符串，已转为字符串{}，并将标识符{}替换。".format(value_from_data, marked_variable))

                elif marked_variable == "unregistered_phone":
                    # 如果marked_variable是unregistered_phone，表示要生成一个未注册的新手机号，从python脚本中获取数据来替换。
                    unregistered_phone = handle_faker.get_unregistered_phone()
                    case_str = case_str.replace(f"#{marked_variable}#", unregistered_phone)
                    logger.debug(f"已从python脚本中，生成一个未注册的手机号: {unregistered_phone}，将 #{marked_variable}# 标识符替换完成。")
                    # 把unregistered_phone设置成收到验证码的手机(receive_code_phone)
                    setattr(Data, "receive_code_phone", unregistered_phone)

                elif marked_variable == "unregistered_user_name":
                    # 如果marked_variable是unregistered_user_name，表示要生成一个未注册的用户名，从python脚本中获取数据来替换。
                    unregistered_user_name = handle_faker.get_unregistered_user_name()
                    case_str = case_str.replace(f"#{marked_variable}#", unregistered_user_name)
                    logger.debug(f"已从python脚本中，生成一个未注册的用户名: {unregistered_user_name}，将 #{marked_variable}# 标识符替换完成。")

                elif marked_variable == "unregistered_user_name_3str":
                    # 如果marked_variable是unregistered_user_name_3str，表示要生成一个3个字符、未注册的用户名，从python脚本中获取数据来替换。
                    unregistered_user_name_3str = handle_faker.get_unregistered_user_name_specify_length(3)
                    case_str = case_str.replace(f"#{marked_variable}#", unregistered_user_name_3str)
                    logger.debug(f"已从python脚本中，生成一个3个字符、未注册的用户名: {unregistered_user_name_3str}，将 #{marked_variable}# 标识符替换完成。")

                elif marked_variable == "unregistered_user_name_7str":
                    # 如果marked_variable是unregistered_user_name_7str，表示要生成一个7个字符、未注册的用户名，从python脚本中获取数据来替换。
                    unregistered_user_name_7str = handle_faker.get_unregistered_user_name_specify_length(7)
                    case_str = case_str.replace(f"#{marked_variable}#", unregistered_user_name_7str)
                    logger.debug(f"已从python脚本中，生成一个7个字符、未注册的用户名: {unregistered_user_name_7str}，将 #{marked_variable}# 标识符替换完成。")

                elif marked_variable == "unregistered_user_name_4str":
                    # 如果marked_variable是unregistered_user_name_4str，表示要生成一个4个字符、未注册的用户名，从python脚本中获取数据来替换。
                    unregistered_user_name_4str = handle_faker.get_unregistered_user_name_specify_length(4)
                    case_str = case_str.replace(f"#{marked_variable}#", unregistered_user_name_4str)
                    logger.debug(f"已从python脚本中，生成一个4个字符、未注册的用户名: {unregistered_user_name_4str}，将 #{marked_variable}# 标识符替换完成。")

                elif marked_variable == "unregistered_user_name_6str":
                    # 如果marked_variable是unregistered_user_name_6str，表示要生成一个6个字符、未注册的用户名，从python脚本中获取数据来替换。
                    unregistered_user_name_6str = handle_faker.get_unregistered_user_name_specify_length(6)
                    case_str = case_str.replace(f"#{marked_variable}#", unregistered_user_name_6str)
                    logger.debug(f"已从python脚本中，生成一个6个字符、未注册的用户名: {unregistered_user_name_6str}，将 #{marked_variable}# 标识符替换完成。")

                elif marked_variable == "past_date":
                    # 如果marked_variable是past_date，表示生成一个过去的日期。
                    case_str = case_str.replace(f"#{marked_variable}#", license_establish_validity_date[0])
                    logger.debug(f"已从python脚本中，生成一个过去的日期: {license_establish_validity_date[0]}，将 #{marked_variable}# 标识符替换完成。")

                elif marked_variable == "future_date":
                    # 如果marked_variable是future_date，表示生成一个将来的日期。
                    case_str = case_str.replace(f"#{marked_variable}#", license_establish_validity_date[1])
                    logger.debug(f"已从python脚本中，生成一个将来的日期: {license_establish_validity_date[1]}，将 #{marked_variable}# 标识符替换完成。")

 
 
            # 公开仓库去掉部分代码，已移交至私有仓库。

if __name__ == '__main__':

    single_case = {
        'phone': '#unregistered_phone#',
        'username': '#unregistered_user_name#',
        'username_3str': '#unregistered_user_name_3str#',
        'username_7str': '#unregistered_user_name_7str#',
        'username_4str': '#unregistered_user_name_4str#',
        'username_6str': '#unregistered_user_name_6str#',
        'establishDate': '#past_date#',
        'validityDate': '#future_date#',
        'id': 'file_upload_01',
        'title': '上传图片成功，jpg格式，小于100KB',
        'method': 'post',
        'url': '/file/upload',
        'files': 'test_file_upload_01.jpg',
        'extract_data': '{"code":"$.code","msg":"$.msg","data":"$.data"}',
        'expected_data': '{"code": "0","msg": "操作成功"}'
    }

    handle_replace = HandleReplace()
    handle_replace.replace_one_row_single_case_data(single_case)